package com.loadburn.heron.log;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * @author slacrey (scstlinfeng@yahoo.com)
 *         Date: 13-12-29
 */
public abstract class HeronLog {

    /**
     * 从调用栈取出调用信息
     * @return 调用栈 {@link StackTraceElement}
     */
    private static StackTraceElement onTrace() {
        StackTraceElement[] stackElements = Thread.currentThread().getStackTrace();
        return stackElements[4];
    }

    /**
     * 格式化调用者信息
     * @return 信息
     */
    private static String callerInfo() {
        StackTraceElement onCode = onTrace();
        String callerClass = onCode.getClassName();
        return callerClass.substring(callerClass.lastIndexOf(".") + 1) + " : " + onCode.getMethodName();
    }

    /**
     * 格式化调用者错误输出信息
     * @return 错误信息
     */
    private static String callerError() {
        StackTraceElement onCode = onTrace();
        return onCode.getFileName() + " : " + onCode.getMethodName()
                + " @ line numbers: " + onCode.getLineNumber();
    }

    /**
     * 当前调用日志输出的类
     * @return {@link Class}
     */
    private static String callerClassName() {
        StackTraceElement onCode = onTrace();
        if (onCode == null) {
            return HeronLog.class.getName();
        }
        return onCode.getClassName();
    }

    /**
     * 输出普通信息
     * @param string 要输出的日志信息，或将要输出的格式化日志信息。
     * @param params 输出的参数
     */
    public static void logInfo(String string, Object...  params) {
        Logger log = LoggerFactory.getLogger(callerClassName());
        if (!log.isInfoEnabled())
            return;
        log.info(callerInfo() + " ->> " + String.format(string, params));
    }

    /**
     * 输出调试信息
     * @param string 要输出的日志信息，或将要输出的格式化日志信息。
     * @param params 输出的参数
     */
    public static void logDebug(String string, Throwable throwable, Object... params) {
        Logger log = LoggerFactory.getLogger(callerClassName());
        if (!log.isDebugEnabled())
            return;
        log.debug(callerInfo() + " ->> " + String.format(string, params), throwable);
    }

    /**
     * 输出调试信息
     * @param string 要输出的日志信息，或将要输出的格式化日志信息。
     * @param params 输出的参数
     */
    public static void logDebug(String string, Object... params) {
        Logger log = LoggerFactory.getLogger(callerClassName());
        if (!log.isDebugEnabled())
            return;
        log.debug(callerInfo() + " ->> " + String.format(string, params));
    }

    /**
     * 输出警告信息
     * @param string 要输出的日志信息，或将要输出的格式化日志信息。
     * @param params 输出的参数
     */
    public static void logWarn(String string, Throwable throwable, Object... params) {
        Logger log = LoggerFactory.getLogger(callerClassName());
        if (!log.isWarnEnabled())
            return;
        log.warn(callerInfo() + " ->> " + String.format(string, params));
    }

    /**
     * 输出警告信息
     * @param string 要输出的日志信息，或将要输出的格式化日志信息。
     * @param params 输出的参数
     */
    public static void logWarn(String string, Object... params) {
        Logger log = LoggerFactory.getLogger(callerClassName());
        if (!log.isWarnEnabled())
            return;
        log.warn(callerInfo() + " ->> " + String.format(string, params));
    }

    /**
     * 输出错误信息
     * @param string 要输出的日志信息，或将要输出的格式化日志信息。
     * @param params 输出的参数
     */
    public static void logError(String string, Object... params) {
        Logger log = LoggerFactory.getLogger(callerClassName());
        if (!log.isErrorEnabled())
            return;
        log.error(callerError() + " ->> " + String.format(string, params));
    }

    /**
     * 输出Trace信息
     * @param string 要输出的日志信息，或将要输出的格式化日志信息。
     * @param params 输出的参数
     */
    public static void logTrace(String string, Object... params) {
        Logger log = LoggerFactory.getLogger(callerClassName());
        if (!log.isTraceEnabled())
            return;
        log.info(callerInfo() + " ->> " + String.format(string, params));
    }

}
